home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
System Booster
/
System Booster.iso
/
Texteditors
/
XDME
/
Src
/
filereq.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-09-26
|
15KB
|
751 lines
/******************************************************************************
MODUL
filereq.c
DESCRIPTION
All routines that handle file-requesters. We try to open ASL and
if that's not possible, REQTOOLS.
NOTES
BUGS
TODO
EXAMPLES
SEE ALSO
INDEX
HISTORY
28. Nov 1992 ada created
******************************************************************************/
/**************************************
Includes
**************************************/
#include "defs.h"
/**************************************
Globale Variable
**************************************/
Prototype void do_pattern (void);
Prototype void do_aslload (void);
Prototype int aslsave (void);
Prototype void do_aslinsfile (void);
Prototype void do_aslfont (void);
Prototype void do_reqload (void);
Prototype int reqsave (void);
Prototype void do_reqinsfile (void);
Prototype void do_reqfont (void);
Prototype void splitpath (char *, char *, char *);
Prototype void fixdirname (char *);
Prototype struct FileRequester * FReq;
Prototype struct ReqToolsBase * ReqToolsBase;
Prototype struct rtFileRequester * RFReq;
struct FileRequester * FReq; /* File-Req. structure */
struct rtFileRequester * RFReq;
struct ReqToolsBase * ReqToolsBase;
/**************************************
Interne Defines & Strukturen
**************************************/
/**************************************
Interne Variable
**************************************/
static char pattern[64] = "";
static char file[108];
static char dir[PATHSIZE];
/**************************************
Interne Prototypes
**************************************/
void do_pattern (void)
{
strncpy (pattern, av[1], 63);
pattern[63] = 0;
}
void do_aslload (void)
{
BPTR oldlock;
BOOL ret;
oldlock = CurrentDir (Ep->dirlock);
splitpath (Ep->name, file, dir);
if (!stricmp (file, "unnamed"))
*file = 0;
fixdirname (dir);
if (AslBase)
{ /* If we have asl.library & requester */
if (!FReq)
FReq = AllocAslRequest (ASL_FileRequest, NULL);
if (!FReq)
{
nomemory ();
return;
}
ret = AslRequestTags ((APTR)FReq,
ASL_Hail, "XDME Load New File",
ASL_OKText, "Load",
ASL_Window, Ep->win,
ASL_FuncFlags, FILF_NEWIDCMP | FILF_PATGAD,
ASL_Dir, dir,
ASL_File, file,
ASL_Pattern, pattern,
ASL_LeftEdge, Ep->config.aslleft + Ep->win->LeftEdge, /* use config coords */
ASL_TopEdge, Ep->config.asltop + Ep->win->TopEdge,
ASL_Width, Ep->config.aslwidth,
ASL_Height, Ep->config.aslheight,
TAG_DONE
);
Ep->config.asltop = FReq->rf_TopEdge - Ep->win->TopEdge; /* save coords */
Ep->config.aslleft = FReq->rf_LeftEdge - Ep->win->LeftEdge;
Ep->config.aslwidth = FReq->rf_Width;
Ep->config.aslheight = FReq->rf_Height;
if (ret)
{
BPTR newlock;
if ((newlock = Lock (FReq->rf_Dir, SHARED_LOCK)))
{
BPTR cd = CurrentDir (oldlock);
Ep->dirlock = (long)newlock;
strcpy (pattern, FReq->rf_Pat);
av[0] = (UBYTE *)"n";
av[1] = (UBYTE *) FReq->rf_File;
if (do_edit () == -1)
{
Ep->dirlock = (long)cd;
UnLock (newlock);
}
else
UnLock (cd);
}
} else
{
globalflags.Abortcommand = 1;
CurrentDir (oldlock);
}
} else
{ /* no asl.library? try reqtools */
do_reqload ();
}
} /* do_aslload */
int aslsave (void)
{
BPTR oldlock = CurrentDir (Ep->dirlock);
BOOL ret;
splitpath (Ep->name, file, dir);
if (!stricmp (file, "unnamed"))
*file = 0;
fixdirname (dir);
if (AslBase)
{
if (!FReq)
FReq = AllocAslRequest (ASL_FileRequest, NULL);
if (!FReq)
{
nomemory ();
return (FALSE);
}
loop:
ret = AslRequestTags( (APTR)FReq,
ASL_Hail, "XDME Save File",
ASL_OKText, "Save",
ASL_Window, Ep->win,
ASL_FuncFlags, FILF_NEWIDCMP | FILF_SAVE,
ASL_Dir, dir,
ASL_File, file,
ASL_LeftEdge, Ep->config.aslleft + Ep->win->LeftEdge, /* use config coords */
ASL_TopEdge, Ep->config.asltop + Ep->win->TopEdge,
ASL_Width, Ep->config.aslwidth,
ASL_Height, Ep->config.aslheight,
TAG_DONE
);
Ep->config.asltop = FReq->rf_TopEdge - Ep->win->TopEdge; /* save coords */
Ep->config.aslleft = FReq->rf_LeftEdge - Ep->win->LeftEdge;
Ep->config.aslwidth = FReq->rf_Width;
Ep->config.aslheight = FReq->rf_Height;
if (ret)
{
BPTR tmp_lock;
if (!stricmp (FReq->rf_File, "unnamed"))
{
error ("arpsave:\nCannot save file as\n`unnamed'");
*file = 0;
goto loop;
}
CurrentDir (oldlock);
strcpy (file, FReq->rf_File);
strcpy (dir, FReq->rf_Dir);
strcpy (pattern, FReq->rf_Pat);
if (!*file)
{
error ("%s:\nYou must specify a name", av[0]);
goto loop;
}
AddPart (dir, file, PATHSIZE);
av[1] = (UBYTE *)dir;
if ((tmp_lock = Lock (dir, ACCESS_READ)))
{
UnLock (tmp_lock);
if (!getyn ("XDME Warning",
"The file\n`%s'\ndoes already exist."
"Do you want to overwrite it ?",
"Yes|No", dir) )
return (FALSE);
}
return (do_saveas ());
} else
{
globalflags.Abortcommand = 1;
CurrentDir (oldlock);
}
} else
{
return (do_reqsave ());
}
return (FALSE);
} /* aslsave */
void do_aslinsfile (void)
{
BPTR oldlock = CurrentDir (Ep->dirlock);
BOOL ret;
splitpath (Ep->name, file, dir);
if (!stricmp (file, "unnamed"))
*file = 0;
fixdirname (dir);
if (AslBase)
{
if (!FReq)
FReq = AllocAslRequest (ASL_FileRequest, NULL);
if (!FReq)
{
nomemory ();
return;
}
ret = AslRequestTags ((APTR)FReq,
ASL_Hail, "XDME Insert File",
ASL_OKText, "Insert",
ASL_Window, Ep->win,
ASL_FuncFlags, FILF_NEWIDCMP | FILF_PATGAD,
ASL_Dir, dir,
ASL_File, file,
ASL_Pattern, pattern,
ASL_LeftEdge, Ep->config.aslleft + Ep->win->LeftEdge, /* use config coords */
ASL_TopEdge, Ep->config.asltop + Ep->win->TopEdge,
ASL_Width, Ep->config.aslwidth,
ASL_Height, Ep->config.aslheight,
TAG_DONE );
Ep->config.asltop = FReq->rf_TopEdge - Ep->win->TopEdge; /* save coords */
Ep->config.aslleft = FReq->rf_LeftEdge - Ep->win->LeftEdge;
Ep->config.aslwidth = FReq->rf_Width;
Ep->config.aslheight = FReq->rf_Height;
if (ret)
{
CurrentDir (oldlock);
/* Fields are READ-ONLY */
strcpy (file, FReq->rf_File);
strcpy (dir, FReq->rf_Dir);
strcpy (pattern, FReq->rf_Pat);
AddPart (dir, file, PATHSIZE);
av[0] = (UBYTE *)"i";
av[1] = (UBYTE *)dir;
do_edit ();
} else
{
globalflags.Abortcommand = 1;
CurrentDir (oldlock);
}
} else
{
do_reqinsfile ();
}
} /* do_aslinsfile */
void do_aslfont (void)
{
if (AslBase)
{
struct FontRequester *fontreq;
#ifdef _DCC
ULONG fwin = (ULONG)Ep->win; /* put ASL on correct screen */
#endif
struct TagItem FontTags[] =
{ /* DICE 2.06.37 allows us to initialize this here... */
#ifdef _DCC
ASL_Window, fwin,
ASL_LeftEdge, Ep->config.aslleft + Ep->win->LeftEdge, /* use config coords */
ASL_TopEdge, Ep->config.asltop + Ep->win->TopEdge,
#else
ASL_Window, 0L,
ASL_LeftEdge, 0L,
ASL_TopEdge, 0L,
#endif
ASL_Hail, (ULONG)"XDME fixed width font",
ASL_FuncFlags, FILF_NEWIDCMP | FONF_FIXEDWIDTH,
/* Removed Min & MaxHeight since I cannot figure out what the
user may want */
TAG_DONE
};
#ifndef _DCC
FontTags[0].ti_Data = (ULONG)Ep->win;
FontTags[1].ti_Data = Ep->config.aslleft + Ep->win->LeftEdge;
FontTags[2].ti_Data = Ep->config.asltop + Ep->win->TopEdge;
#endif
if ((fontreq = (struct FontRequester *)
AllocAslRequest (ASL_FontRequest,FontTags) ))
{
if (AslRequest (fontreq, NULL))
{
/* Since we have GetFont() already, just pass
* the name and size from fontreq's TextAttr to it.
*
* What follows mimics SETFONT (in cmnd3.c)
*/
FONT * font = (FONT *)GetFont( fontreq->fo_Attr.ta_Name,
(short) fontreq->fo_Attr.ta_YSize );
ED * ep = Ep;
if (font)
{
if (ep->font)
CloseFont (ep->font);
ep->font = font;
SetFont (ep->win->RPort, font);
SetRast (ep->win->RPort, 0);
RefreshWindowFrame (ep->win);
set_window_params ();
text_adjust (TRUE);
} else
{
error ("aslfont:\nUnable to find font\n%s/%ld", fontreq->fo_Attr.ta_Name,
fontreq->fo_Attr.ta_YSize);
}
}
else
globalflags.Abortcommand = 1;
FreeAslRequest (fontreq);
}
else
{
nomemory ();
}
} else
{
do_reqfont ();
}
} /* do_aslfont */
/* this little kludge gets a DIR: string for the ASL requester
*/
void fixdirname (char * dir)
{
if (!strlen (dir))
{ /* if no DIR; KLUDGE ALERT! */
if (NameFromLock (Ep->dirlock, dir, PATHSIZE)!=DOSTRUE)
{
dir[0] = 0; /* assumes NameFromLock doesn't clean up on err(??) */
}
}
} /* fixdirname */
/*
* Search backwards for first ':' or '/' and split path there.
* This subroutine may appear to be coded incorrectly to a novice
* programmer. It isn't [now].
*/
void splitpath (char * name, char * file, char * dir)
{
int i;
strcpy (file, FilePart (name));
i = (long)PathPart (name) - (long)name;
movmem (name, dir, i);
dir[i] = 0;
} /* splitpath */
/*
* The REQ interface uses the reqtools.library if it exists, else tries to
* use the ARP interfafce.
*/
void do_reqload (void)
{
BPTR oldlock = CurrentDir (Ep->dirlock);
splitpath (Ep->name, file, dir);
if (!stricmp (file, "unnamed"))
*file = 0;
fixdirname (dir);
if (ReqToolsBase)
{ /* If we have req.library & requester */
if (!RFReq)
RFReq = rtAllocRequestA (RT_FILEREQ, NULL);
if (!RFReq)
{
nomemory ();
return;
}
rtChangeReqAttr (RFReq, RTFI_Dir, dir, TAG_DONE);
if (rtFileRequest (RFReq, file, "XDME Load New File",
RTFI_OkText, "Load",
RT_Window, Ep->win,
RT_ReqPos, REQPOS_TOPLEFTSCR,
RT_LeftOffset, Ep->config.aslleft,
RT_TopOffset, Ep->config.asltop,
RTFI_Height, Ep->config.aslheight,
TAG_DONE ))
{
BPTR newlock;
if ((newlock = Lock (RFReq->Dir, SHARED_LOCK)))
{
BPTR cd = CurrentDir (oldlock);
Ep->dirlock = (long)newlock;
strcpy (dir, RFReq->Dir);
AddPart (dir, file, PATHSIZE);
av[0] = (UBYTE *)"n";
av[1] = (UBYTE *) file;
if (do_edit () == -1)
{
Ep->dirlock = (long)cd;
UnLock (newlock);
}
else
UnLock (cd);
}
} else
{
globalflags.Abortcommand = 1;
CurrentDir (oldlock);
}
} else
{ /* no req.library? Gulp */
if (AslBase)
error ("reqload:\nNo ReqTools.Library\nTry ARPLOAD");
else
error ("For filerequester,\nI need REQ- or ASL.LIBRARY !");
}
} /* do_reqload */
int reqsave (void)
{
BPTR oldlock = CurrentDir(Ep->dirlock);
splitpath (Ep->name, file, dir);
if (!stricmp (file, "unnamed"))
*file = 0;
fixdirname (dir);
if (ReqToolsBase)
{ /* If we have req.library & requester */
if (!RFReq)
RFReq = rtAllocRequestA (RT_FILEREQ, NULL);
if (!RFReq)
{
nomemory ();
return (FALSE);
}
rtChangeReqAttr (RFReq, RTFI_Dir, dir, TAG_DONE);
loop:
if (rtFileRequest (RFReq, file, "XDME Save File",
RTFI_OkText, "Save",
RT_Window, Ep->win,
RTFI_Flags, FREQF_SAVE,
RT_ReqPos, REQPOS_TOPLEFTSCR,
RT_LeftOffset, Ep->config.aslleft,
RT_TopOffset, Ep->config.asltop,
RTFI_Height, Ep->config.aslheight,
TAG_DONE ))
{
BPTR tmp_lock;
if (!stricmp (file, "unnamed"))
{
error ("arpsave:\nCannot save file as\n`unnamed'");
goto loop;
}
CurrentDir (oldlock);
strcpy (dir, RFReq->Dir);
AddPart (dir, file, PATHSIZE);
if (!*file)
{
error ("%s:\nYou must specify a name", av[0]);
goto loop;
}
av[1] = (UBYTE *)dir;
if ((tmp_lock = Lock (dir, ACCESS_READ)))
{
UnLock (tmp_lock);
if (!getyn ("XDME Warning",
"The file\n`%s'\ndoes already exist."
"Do you want to overwrite it ?",
"Yes|No", dir) )
return (FALSE);
}
return (do_saveas ());
} else
{
globalflags.Abortcommand = 1;
CurrentDir (oldlock);
}
} else
{
if (AslBase)
error ("reqsave:\nNo ReqTools.Library\nTry ARPSAVE");
else
error ("For filerequester,\nI need REQ- or ASL.LIBRARY !");
}
return (FALSE);
} /* reqsave */
void do_reqinsfile (void)
{
BPTR oldlock = CurrentDir (Ep->dirlock);
splitpath (Ep->name, file, dir);
if (!stricmp (file, "unnamed"))
*file = 0;
fixdirname (dir);
if (ReqToolsBase)
{ /* If we have req.library & requester */
if (!RFReq)
RFReq = rtAllocRequestA (RT_FILEREQ, NULL);
if (!RFReq)
{
nomemory ();
return;
}
rtChangeReqAttr (RFReq, RTFI_Dir, dir, TAG_DONE);
if (rtFileRequest (RFReq, file, "XDME Insert File",
RTFI_OkText, "Load",
RT_ReqPos, REQPOS_TOPLEFTSCR,
RT_Window, Ep->win,
RT_LeftOffset, Ep->config.aslleft,
RT_TopOffset, Ep->config.asltop,
RTFI_Height, Ep->config.aslheight,
TAG_DONE ))
{
CurrentDir (oldlock);
strcpy (dir, RFReq->Dir);
AddPart (dir, file, PATHSIZE);
av[0] = (UBYTE *)"i";
av[1] = (UBYTE *)file;
do_edit ();
} else
{
globalflags.Abortcommand = 1;
CurrentDir (oldlock);
}
} else
{
if (AslBase)
error ("reqinsfile:\nNo ReqTools.Library\nTry ARPINSFILE");
else
error ("For filerequester,\nI need REQ- or ASL.LIBRARY !");
}
} /* do_reqinsfile */
void do_reqfont (void)
{
if (ReqToolsBase)
{
struct rtFontRequester *fontreq;
#ifdef _DCC
struct Window *fwin = Ep->win; /* put ASL on correct screen */
#endif
struct TagItem FontTags[] =
{ /* DICE 2.06.37 allows us to initialize this here... */
#ifdef _DCC
RT_Window, fwin,
#else
RT_Window, NULL,
#endif
RTFO_MinHeight, 6,
RTFO_MaxHeight, 24,
RTFO_Flags, FREQF_FIXEDWIDTH, /* | FILF_NEWIDCMP */
TAG_DONE };
#ifndef _DCC
FontTags[0].ti_Data = (ULONG)Ep->win;
#endif
if ((fontreq = rtAllocRequestA (RT_FONTREQ, NULL)))
{
if (rtFontRequestA (fontreq, "XDME fixed width font", FontTags))
{
/* Since we have GetFont() already, just pass
* the name and size from fontreq's TextAttr to it.
*
* What follows mimics SETFONT (in cmnd3.c)
*/
FONT * font = (FONT *)GetFont (fontreq->Attr.ta_Name,
(short) fontreq->Attr.ta_YSize );
ED * ep = Ep;
if (font)
{
if (ep->font)
CloseFont (ep->font);
ep->font = font;
SetFont (ep->win->RPort, font);
SetRast (ep->win->RPort, 0);
RefreshWindowFrame (ep->win);
set_window_params ();
text_adjust (TRUE);
} else
{
error ("aslfont:\nUnable to find font\n%s/%ld", fontreq->Attr.ta_Name,
fontreq->Attr.ta_YSize);
}
}
else
globalflags.Abortcommand = 1;
rtFreeRequest (fontreq);
} else
{
nomemory ();
}
} else
{
if (AslBase)
error ("reqfont:\nNo ReqTools.Library\nTry ARPFONT");
else
error ("Need ASL.LIBRARY or\nREQTOOLS.LIBRARY for\nfont requester !");
}
} /* do_reqfont */
/******************************************************************************
***** ENDE filereq.c
******************************************************************************/